package com.galeno.combiner;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Author:   galeno
 * Date:     21/07/24
 * Description:
 * MR程序的map端 : 继承Mapper类
 * Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
 *     在MR 内部处理数据是以KV的形式处理的
 * KIN:  行的起始位置,快速定位  Long
 * VIN:  行内容              String
 * -----map(读取任务数据  输出局部结果给redce端聚合汇总)
 * KOUT:单词       String
 * VOUT:1        Integer
 * 思考: Map阶段的MT处理数据-->  RT区聚合汇总
 *       MT处理的机器和RT的机器是否在同一个机器
 *       MT(中间结果)  --->  RT 机器上  [数据序列化]
 * KVIN  KVOUT实现序列化     Serializable[JDK]
 * 1) JDK序列化  臃肿 存储了一些和数据无关的信息{包名 类名 数据类型}
 *   14-->
 *   109-->  大量数据 占用网络 ,带宽  慢
 * 2) 使用HDP的序列化方式 [数据变小]
 *
 * KIN: Long  ---> LongWritable
 * vIN:String  --->Text
 * Integer --->Intwritable
 *
 */
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
    // 编写map端处理数据的逻辑
    // map 方法每行数据执行一次
    // 任务切片 128M  hello
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //将行内容变成单词
        String line = value.toString();
        //数据的切割
        String[] words = line.split("\\s+");
        // 遍历单词
        for (String word : words) { // 单词  1
            Text kout = new Text(word);
            IntWritable vout = new IntWritable(1);
            context.write(kout, vout);
            // 分区器 默认的实现
        }
    }
}
